package priv.abadstring.study.websocket;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

/**
 * 申明这是一个 websocket 服务
 * 可以使用 {} 占位符声明参数
 */
@ServerEndpoint("/websocket/{id}")
public class HomeController {

    /**
     * 该方法将在建立连接后执行
     * 会传入 session 对象，就是客户端与服务端建立的长连接通道
     * 通过 @PathParam 获取 url中 声明的参数
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("id") Integer id) throws IOException {
        String s = "Web Socket 已连接. session=" + session + ", id=" + id;
        System.out.println(s);
        // 向客户端发送消息
        session.getBasicRemote().sendText(s);
    }

    /**
     * 在连接关闭后执行
     */
    @OnClose
    public void onClose(Session session) throws IOException {
        String s = "Web Socket 连接关闭. session=" + session;
        System.out.println(s);
        // 连接关闭后不能发消息了
        // session.getBasicRemote().sendText(s);
    }

    /**
     * 接收客户端发来的消息
     */
    @OnMessage
    public void onMessage(Session session, String message) throws IOException {
        String s = "Web Socket 收到来自客户端的消息. session=" + session + ", message=" + message;
        System.out.println(s);
        session.getBasicRemote().sendText(s);
    }

    /**
     * 发生错误时
     */
    @OnError
    public void onError(Session session, Throwable error) throws IOException {
        String s = "Web Socket 发生错误. session=" + session + ", error=" + error;
        System.out.println(s);
        session.getBasicRemote().sendText(s);
    }
}
